import User from "../models/userModel.js";
import bcrypt from "bcryptjs";
import jwt from "jsonwebtoken";

/**
 * 生成JWT Token
 * @param {String} userId - 用户ID
 * @returns {String} JWT token
 */
const generateToken = (userId) => {
  return jwt.sign({ id: userId }, process.env.JWT_SECRET, {
    expiresIn: "7d",
  });
};

/**
 * 用户注册控制器
 * @param {Object} req - 请求对象，包含用户注册信息(name, email, password)
 * @param {Object} res - 响应对象
 * @returns {Object} 注册结果或错误信息
 */
export const registerUser = async (req, res) => {
  try {
    const { name, email, password } = req.body;
    // 检查用户是否已经存在
    const userExist = await User.findOne({ email });

    // 如果用户已存在返回错误信息
    if (userExist) return res.status(400).json({ message: "用户已存在" });
    // 检查密码长度是否符合要求（至少8位）
    if (password.length < 8)
      return res
        .status(400)
        .json({ success: false, message: "密码长度不能小于8位" });

    // 对密码进行加密处理
    const salt = await bcrypt.genSalt(10);
    const hashedPassword = await bcrypt.hash(password, salt);

    // 创建新用户
    const user = await User.create({
      name,
      email,
      password: hashedPassword,
    });
    
    // 返回成功响应和用户信息（包括token）
    res.status(201).json({
      success: true,
      message: "用户创建成功",
      user: {
        id: user._id,
        name: user.name,
        email: user.email,
        token: generateToken(user._id),
      },
    });
  } catch (error) {
    // 处理服务器内部错误
    res
      .status(500)
      .json({ success: false, message: "服务器错误", error: error.message });
  }
};

/**
 * 用户登录控制器
 * @param {Object} req - 请求对象，包含用户登录信息(email, password)
 * @param {Object} res - 响应对象
 * @returns {Object} 登录结果或错误信息
 */
export const loginUser = async (req, res) => {
  try {
    const { email, password } = req.body;
    // 根据邮箱查找用户
    const user = await User.findOne({ email });
    // 如果找不到用户返回错误信息
    if (!user) return res.status(500).json({ message: "邮箱或密码错误" });
    
    // 验证密码是否正确
    const isMatch = await bcrypt.compare(password, user.password);
    // 密码不匹配返回错误信息
    if (!isMatch) return res.status(500).json({ message: "邮箱或密码错误" });

    // 返回登录成功信息和用户数据（包括token）
    res.status(201).json({
      success: true,
      message: "用户创建成功",
      user: {
        id: user._id,
        name: user.name,
        email: user.email,
        token: generateToken(user._id),
      },
    });
  } catch (error) {
    // 处理服务器内部错误
    res
      .status(500)
      .json({ success: false, message: "服务器错误", error: error.message });
  }
};

/**
 * 获取用户个人信息控制器
 * @param {Object} req - 请求对象，包含从JWT解析的用户信息
 * @param {Object} res - 响应对象
 * @returns {Object} 用户信息（不含密码）
 */
export const getUserInfoProfile = async (req, res) => {
  try {
    // 根据用户ID查找用户信息，排除密码字段
    const user = await User.findById(req.user.id).select("-password");
    // 如果找不到用户返回错误信息
    if (!user) return res.status(404).json({ message: "用户不存在" });
    
    // 返回用户信息
    res.json(user);
  } catch (error) {
    // 处理服务器内部错误
    res
      .status(500)
      .json({ success: false, message: "服务器错误", error: error.message });
  }
};